/**
 * @file Thread.hpp
 * @brief 线程封装类的声明
 * @details 封装了pthread，提供面向对象的线程管理接口
 */

#ifndef __Thread_HPP__
#define __Thread_HPP__

#include "Noncopyable.hpp"
#include <stdio.h>
#include <pthread.h>

#include <functional>

namespace wd
{
using ThreadCallback=std::function<void()>;

/**
 * @class Thread
 * @brief 线程封装类
 * @details 封装pthread线程，不可复制，使用回调函数处理线程任务
 */
class Thread : Noncopyable
{
public:
    /**
     * @brief 构造函数
     * @param cb 线程执行的回调函数
     */
    Thread(ThreadCallback && cb);
    
    /**
     * @brief 析构函数
     */
    ~Thread() 
    {
        printf("~Thread()\n");
    }

    /**
     * @brief 启动线程
     */
    void start();
    
    /**
     * @brief 等待线程结束
     */
    void join();

private:
    /**
     * @brief 线程入口函数
     * @param arg 传递给线程的参数
     * @return void指针
     */
    static void * start_routine(void*);

protected:

private:
    pthread_t       _pthid;      ///< 线程ID
    bool            _isRunning;  ///< 线程运行状态
    ThreadCallback  _cb;         ///< 线程回调函数
};


}//end of namespace wd


#endif

